package pt.ObserverBank.basicObjects;
import java.io.Serializable;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Set;
import javax.swing.JOptionPane;
/**
* Holds info about clients and their accounts in a HashMap
*
* @author Chiti
*
*/
public class Bank implements BankProc,Serializable {
private static final long serialVersionUID = -4890879950890782117L;
private int id = 0;
private HashMap<Person, HashSet<Account>> database;
public Bank() {
database = new HashMap<Person, HashSet<Account>>();
}
@Override
public void addPerson(int id, String name) {
assert (name != null && id >= 0) : "Cannot add with null name and/or negative id!";
int preSize = database.size();
if (isWellFormed()) {
Person p = new Person(id, name);
if (database.containsKey(p))
infoBox("Person already exists!", "Add person error.");
else {
database.put(p, new HashSet<Account>());
int postSize=database.size();
assert (postSize==preSize+1):"Not a valid addition!";
}
}
}
@Override
public void removePerson(int id, String name) {
assert (name != null && id >= 0) : "Cannot delete if null name and/or negative id!";
int preSize = database.size();
if (isWellFormed()) {
Person p = new Person(id, name);
if (database.containsKey(p)) {
database.remove(p);
int postSize=database.size();
assert (postSize==preSize-1):""+"Not a valid deletion!";
} else
infoBox("Person does not exist!", "Remove person error.");
}
}
@Override
public void addAccount(Person person, double sum, AccountType type) {
assert (person!=null && sum>0):"Cannot add acount if null name and/or negative sum!";
if (isWellFormed())
if (database.containsKey(person)) {
Account a;
switch (type) {
case SAVINGS:
a = new SavingAccount(id, sum);
HashSet<Account> list = (HashSet<Account>) database.get(person);
int presize=list.size();
list.add(a);
int postsize=list.size();
assert (postsize==presize+1):"Invalid add acount!";
id++;
database.put(person, list);
break;
case SPENDINGS:
a = new SpendingAccount(id, sum);
HashSet<Account> list1 = (HashSet<Account>) database.get(person);
int presize1=list1.size();
list1.add(a);
int postsize1=list1.size();
assert (postsize1==presize1+1):"Invalid add acount!";
id++;
database.put(person, list1);
break;
}
} else
infoBox("Person does not exist!", "Add account error.");
}
@Override
public void removeAccount(Person person, int accountId, AccountType type) {
assert (person!=null && accountId>=0):"Cannot add acount if null name and/or negative id!";
if (isWellFormed())
if (database.containsKey(person)) {
HashSet<Account> list = (HashSet<Account>) database.get(person);
int presize=list.size();
switch (type) {
case SAVINGS:
SavingAccount delete = new SavingAccount(0, 0);
for (Account a : list)
if (a.getId() == accountId)
delete = (SavingAccount) a;
list.remove(delete);
int postsize=list.size();
if (!delete.equals(new SavingAccount(0,0)))
assert (postsize==presize-1):"Invalid remove acount!";
database.put(person, list);
break;
case SPENDINGS:
SpendingAccount delete1 = new SpendingAccount(0, 0);
for (Account a : list)
if (a.getId() == accountId)
delete1 = (SpendingAccount) a;
list.remove(delete1);
int postsize1=list.size();
if (!delete1.equals(new SpendingAccount(0,0)))
assert (postsize1==presize-1):"Invalid remove acount!";
database.put(person, list);
break;
}
} else
infoBox("Person does not exist!", "Remove account error.");
}
@Override
public void withdraw(Person person, int accountId, double sum) {
assert (person != null && accountId >= 0 && sum > 0) : "Cannot withdraw if null name and/or negative id/sum!";
if (isWellFormed())
if (database.containsKey(person)) {
HashSet<Account> list = (HashSet<Account>) database.get(person);
for (Account a : list)
if (a.getId() == accountId) {
double preBalance=a.inquire();
a.withdraw(sum);
double postBalance=a.inquire();
assert (preBalance-sum-0.001<postBalance && postBalance<preBalance-sum+0.001):"Invalid withdraw!";
}
} else
infoBox("Person does not exist!", "Withdraw error.");
}
@Override
public void applyInterest(Person person, int accountId, double interest) {
if (isWellFormed())
if (database.containsKey(person)) {
{
HashSet<Account> list = (HashSet<Account>) database.get(person);
for (Account a : list)
if (a.getId() == accountId)
if (a.getClass().toString().equals("class pt.ObserverBank.basicObjects.SavingAccount"))
a.add((a.inquire() * interest) / 100);
}
}
}
@Override
public void deposit(Person person, int accountId, double sum) {
assert (person != null && accountId >= 0 && sum > 0) : "Cannot withdraw if null name and/or negative id/sum!";
if (isWellFormed())
if (database.containsKey(person)) {
HashSet<Account> list = (HashSet<Account>) database.get(person);
for (Account a : list)
if (a.getId() == accountId)
{
double preBalance=a.inquire();
a.add(sum);
double postBalance=a.inquire();
assert (preBalance+sum-0.001<postBalance && postBalance<preBalance+sum+0.001):"Invalid deposit!";
}
}
}
/**
* @return the database
*/
public HashMap<Person, HashSet<Account>> getDatabase() {
return database;
}
/**
* @param database the database to set
*/
public void setDatabase(HashMap<Person, HashSet<Account>> database) {
this.database = database;
}
/**
* method for the class invariant
* @return
*/
private boolean isWellFormed() {
if (database == null)
return false;
return true;
}
public Account getAccount(Person p,int accountId){
if(isWellFormed())
if (database.containsKey(p))
{
HashSet<Account> list=database.get(p);
for (Account a:list)
if (a.getId()==accountId)
return a;
}
return null;
}
public String listClient(Person person) {
StringBuilder sb = new StringBuilder();
if (isWellFormed())
if (database.containsKey(person)) {
HashSet<Account> list = (HashSet<Account>) database.get(person);
sb.append(person.toString() + ":\n");
for (Account a : list)
sb.append(a.toString() + ";\n");
}else infoBox("No such client!","List Error.");
return sb.toString();
}
/*
* (non-Javadoc)
*
* @see java.lang.Object#toString()
*/
@Override
public String toString() {
StringBuilder sb = new StringBuilder();
Set<Person> keys = database.keySet();
for (Person key : keys) {
sb.append("_________________________________________________________________\n");
HashSet<Account> list = (HashSet<Account>) database.get(key);
sb.append(key.toString() + ":\n");
for (Account a : list)
sb.append(a.toString() + ";\n");
}
return sb.toString();
}
/**
* used to tell the user what happend
*
* @param infoMessage
* @param titleBar
*/
public static void infoBox(String infoMessage, String titleBar) {
JOptionPane.showMessageDialog(null, infoMessage, titleBar, JOptionPane.INFORMATION_MESSAGE);
}
}